package com.itheima.d4_synchronized_code;

/**
 * 目标：模拟线程安全问题。
 *
 *
 * 线程同步的常见方案
 * 加锁：每次只允许一个线程加锁，加锁后才能进入访问，访问完毕后自动解锁，然后其他线程才能再加锁进来。
 *
 * 同步代码块
 * 作用：把访问共享资源的核心代码给上锁，以此保证线程安全。
 * synchronized(同步锁) {
 * 访问共享资源的核心代码
 * }
 * 原理：每次只允许一个线程加锁后进入，执行完毕后自动解锁，其他线程才可以进来执行。
 *
 * 同步锁的注意事项
 * 对于当前同时执行的线程来说，同步锁必须是同一把（同一个对象），否则会出bug。
 *
 * 锁对象随便选择一个唯一的对象好不好呢?
 * 不好，会影响其他无关线程的执行。
 *
 * 锁对象的使用规范:
 * 建议使用共享资源作为锁对象，对于实例方法建议使用this作为锁对象。
 * 对于静态方法建议使用字节码（类名.class）对象作为锁对象。
 *
 */
public class ThreadTest {
    public static void main(String[] args) {
        // 1、创建一个账户对象，代表两个人的共享账户。
        Account acc = new Account("ICBC-110", 100000);
        // 2、创建两个线程，分别代表小明 小红，再去同一个账户对象中取钱10万。
        //模拟小明和小红用同一个账户，所以两个线程要接收账户对象为参数，所以DrawThread实现类要提供相应的有参构造器
        //并且给线程命名
        new DrawThread(acc, "小明").start(); // 小明
        new DrawThread(acc, "小红").start(); // 小红

        Account acc1 = new Account("ICBC-112", 100000);
        new DrawThread(acc1, "小黑").start(); // 小黑
        new DrawThread(acc1, "小白").start(); // 小白

    }
}
